import Vue from 'vue'
import Axios from 'axios'; // 引入axios
import Global from './global'; // 引入global.js=
/*
	ajax 回调
*/
Vue.prototype.Ajax_callback = function(data, func = {}) {
	if (data.status == 'success') {
		if (typeof func.success == 'function') {
			func.success(data);
		} else {
			this.default_success(data);
		}
	} else if (data.status == 'fail') {
		if (typeof func.fail == 'function') {
			func.fail(data);
		} else {
			this.default_fail(data);
		}
	}
}
/*
	定义success的回调和默认回调
*/
Vue.prototype.default_success = function(data) {
	this.$message.success(data.msg);
}
/*
	定义fail的回调和默认回调
*/
Vue.prototype.default_fail = function(data) {
	this.$message.error(data.msg);
}
// 调试输出
Vue.prototype._echo = function(message, type = 'log') {
	if (!this.$g.debug) return;
	if (type == 'info') {
		// console.info(message);
	} else if (type == 'error') {
		// console.error(message);
	} else {
		// console.log(message);
	}
}

Vue.prototype.e_confirm = function(param = {}) {

	//是否可通过点击遮罩关闭 MessageBox ,默认是
	if (!param.hasOwnProperty('freecolse')) {
		param.freecolse = true;
	}
	if (!param.hasOwnProperty('txt')) {
		param.txt = '确定要进行此操作吗？';
	}
	if (!param.hasOwnProperty('yes')) {
		param.yes = (data => {
			this.$message.error('非法操作！')
		})

	}
	if (!param.hasOwnProperty('cancel')) {
		param.cancel = (data => {
			this.$message.warning('已取消操作！')
		})

	}
	this.$confirm(param.txt, '提示', {
		confirmButtonText: '确定',
		cancelButtonText: '取消',
		closeOnClickModal: param.freecolse,
		type: 'warning'
	}).then(() => {
		var funcc = eval(param.yes);
		new funcc;
	}).catch(() => {
		var funcc = eval(param.cancel);
		new funcc;
	});
}
Vue.prototype.in_array = function(stringToSearch, arrayToSearch) {
	// console.log(stringToSearch, arrayToSearch);
	for (var s = 0; s < arrayToSearch.length; s++) {
		var thisEntry = arrayToSearch[s].toString();
		if (thisEntry == stringToSearch) {
			return true;
		}
	}
	return false;
};



//和PHP一样的时间戳格式化函数
//@param  {string} format    格式
//@param  {int}    timestamp 要格式化的时间 默认为当前时间
//@return {string}           格式化的时间字符串
Vue.prototype.date = function(format, timestamp) {
	var a, jsdate = ((timestamp) ? new Date(timestamp * 1000) : new Date());
	var pad = function(n, c) {
		if ((n = n + "").length < c) {
			return new Array(++c - n.length).join("0") + n;
		} else {
			return n;
		}
	};
	var txt_weekdays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
	var txt_ordin = {
		1: "st",
		2: "nd",
		3: "rd",
		21: "st",
		22: "nd",
		23: "rd",
		31: "st"
	};
	var txt_months = ["", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
	var f = {
		// Day
		d: function() {
			return pad(f.j(), 2);
		},
		D: function() {
			t = f.l();
			return t.substr(0, 3);
		},
		j: function() {
			return jsdate.getDate();
		},
		l: function() {
			return txt_weekdays[f.w()];
		},
		N: function() {
			return f.w() + 1;
		},
		S: function() {
			return txt_ordin[f.j()] ? txt_ordin[f.j()] : 'th';
		},
		w: function() {
			return jsdate.getDay();
		},
		z: function() {
			return (jsdate - new Date(jsdate.getFullYear() + "/1/1")) / 864e5 >> 0;
		},
		// Week
		W: function() {
			var a = f.z(),
				b = 364 + f.L() - a;
			var nd2, nd = (new Date(jsdate.getFullYear() + "/1/1").getDay() || 7) - 1;
			if (b <= 2 && ((jsdate.getDay() || 7) - 1) <= 2 - b) {
				return 1;
			} else {
				if (a <= 2 && nd >= 4 && a >= (6 - nd)) {
					nd2 = new Date(jsdate.getFullYear() - 1 + "/12/31");
					return date("W", Math.round(nd2.getTime() / 1000));
				} else {
					return (1 + (nd <= 3 ? ((a + nd) / 7) : (a - (7 - nd)) / 7) >> 0);
				}
			}
		},
		// Month
		F: function() {
			return txt_months[f.n()];
		},
		m: function() {
			return pad(f.n(), 2);
		},
		M: function() {
			t = f.F();
			return t.substr(0, 3);
		},
		n: function() {
			return jsdate.getMonth() + 1;
		},
		t: function() {
			var n;
			if ((n = jsdate.getMonth() + 1) == 2) {
				return 28 + f.L();
			} else {
				if (n & 1 && n < 8 || !(n & 1) && n > 7) {
					return 31;
				} else {
					return 30;
				}
			}
		},
		// Year
		L: function() {
			var y = f.Y();
			return (!(y & 3) && (y % 1e2 || !(y % 4e2))) ? 1 : 0;
		},
		//o not supported yet
		Y: function() {
			return jsdate.getFullYear();
		},
		y: function() {
			return (jsdate.getFullYear() + "").slice(2);
		},
		// Time
		a: function() {
			return jsdate.getHours() > 11 ? "pm" : "am";
		},
		A: function() {
			return f.a().toUpperCase();
		},
		B: function() {
			// peter paul koch:
			var off = (jsdate.getTimezoneOffset() + 60) * 60;
			var theSeconds = (jsdate.getHours() * 3600) +
				(jsdate.getMinutes() * 60) +
				jsdate.getSeconds() + off;
			var beat = Math.floor(theSeconds / 86.4);
			if (beat > 1000) beat -= 1000;
			if (beat < 0) beat += 1000;
			if ((String(beat)).length == 1) beat = "00" + beat;
			if ((String(beat)).length == 2) beat = "0" + beat;
			return beat;
		},
		g: function() {
			return jsdate.getHours() % 12 || 12;
		},
		G: function() {
			return jsdate.getHours();
		},
		h: function() {
			return pad(f.g(), 2);
		},
		H: function() {
			return pad(jsdate.getHours(), 2);
		},
		i: function() {
			return pad(jsdate.getMinutes(), 2);
		},
		s: function() {
			return pad(jsdate.getSeconds(), 2);
		},
		//u not supported yet
		// Timezone
		//e not supported yet
		//I not supported yet
		O: function() {
			var t = pad(Math.abs(jsdate.getTimezoneOffset() / 60 * 100), 4);
			if (jsdate.getTimezoneOffset() > 0) t = "-" + t;
			else t = "+" + t;
			return t;
		},
		P: function() {
			var O = f.O();
			return (O.substr(0, 3) + ":" + O.substr(3, 2));
		},
		//T not supported yet
		//Z not supported yet
		// Full Date/Time
		c: function() {
			return f.Y() + "-" + f.m() + "-" + f.d() + "T" + f.h() + ":" + f.i() + ":" + f.s() + f.P();
		},
		//r not supported yet
		U: function() {
			return Math.round(jsdate.getTime() / 1000);
		}
	};
	return format.replace(/[\\]?([a-zA-Z])/g, function(t, s) {
		if (t != s) {
			// escaped
			ret = s;
		} else if (f[s]) {
			// a date function exists
			ret = f[s]();
		} else {
			// nothing special
			ret = s;
		}
		return ret;
	});
}
/**
 * 获取access_token 方法封装
 */
/*Vue.prototype.get_access_token = function() {
    Axios.get('/accessToken?client_id=' + Global.client_id + '&secret=' + Global.secret)
        .then(response => {
            let data = response.data
            Global.access_token = data.access_token;
            localStorage.setItem('token', Global.access_token);
        
        });
}*/


Vue.prototype.get_access_token = function() {
	var arr = {
		client_id: Global.client_id,
		secret: Global.secret
	}
	var data = JSON.stringify(arr);
	Axios.get('/accessToken?company=BL&device_name=TE-0600R&data=' + data)
		.then(response => {
			let data = response.data
			Global.access_token = data.access_token;
			localStorage.setItem('token', Global.access_token);
		});
}

/**
 * 表单验证规则
 */
Vue.prototype.rules = {
	account: {
		reg: /^[\w+]{4,20}$/,
		msg: '账号由4~20位英文、数字、下划线组成'
	},
	pwd: {
		reg: /^[\w+]{6,20}$/,
		msg: '密码由6~20位英文、数字、下划线组成'
	},
	spaceKey: {
		reg: /^\S+$/,
		msg: '请勿输入空格'
	},
	trim: {
		reg: /(^\S+)|(\S+$)/,
		msg: '内容前后不可有空格'
	},
	leftTrim: {
		reg: /^\S/,
		msg: '内容前后不可有空格'
	},
	rightTrim: {
		reg: /\S$/,
		msg: '内容前后不可有空格'
	},
	mobile: {
		reg: /^[1][3,4,5,7,8][0-9]{9}$|^(([0\+]\d{2,3}-)?(0\d{2,3})-)(\d{7,8})(-(\d{3,}))?$/,
		msg: '电话格式不正确'
	},
	ip: {
		reg: /^(?:(?:2[0-4][0-9]\.)|(?:25[0-5]\.)|(?:1[0-9][0-9]\.)|(?:[1-9][0-9]\.)|(?:[0-9]\.)){3}(?:(?:2[0-5][0-5])|(?:25[0-5])|(?:1[0-9][0-9])|(?:[1-9][0-9])|(?:[0-9]))$/,
		msg: '请输入正确的ip地址'
	},
	mask: {
		reg: /^(254|252|248|240|224|192|128|0)\.0\.0\.0|255\.(254|252|248|240|224|192|128|0)\.0\.0|255\.255\.(254|252|248|240|224|192|128|0)\.0|255\.255\.255\.(254|252|248|240|224|192|128|0)$/,
		msg: '请输入正确的子网掩码'
	},
	chinese: {
		reg: /^[\u4e00-\u9fa5\w]+$/,
		msg: '请勿输入特殊字符'
	}
};

//导出地址
Vue.prototype.export_excel = function(url = '', params = {}, name = '导出数据', flag) {
	if (is_empty(url)) {
		this.$message.warning("导出地址不能为空！")
		return false;
	}

	this.$ajax.post(url, params, {
		responseType: 'blob'
	}).then(res => {
		if (!res) return;
		let filename = null;

		if (flag === 'zip') {
			filename = res.headers['content-disposition'] ? res.headers("Content-Disposition").split(";")[1].split("filename=")[1] : name + '.zip';
		} else {
			filename = res.headers['content-disposition'] ? res.headers("Content-Disposition").split(";")[1].split("filename=")[1] : name + '.xls';
		}
		let blob = res.data;

		if (typeof window.navigator.msSaveBlob !== 'undefined') {
			window.navigator.msSaveBlob(blob, filename);
		} else {
			var blobURL = window.URL.createObjectURL(blob);
			var tempLink = document.createElement('a');
			tempLink.style.display = 'none';
			tempLink.href = blobURL;
			tempLink.setAttribute('download', filename);

			if (typeof tempLink.download === 'undefined') {
				tempLink.setAttribute('target', '_blank');
			}

			document.body.appendChild(tempLink);
			tempLink.click();
			document.body.removeChild(tempLink);
			window.URL.revokeObjectURL(blobURL);
		}
	})
};

/**
 * 导出信息
 */
Vue.prototype.exportExcelGet = function(url = '', params = {}, name = '导出数据', flag) {
	if (is_empty(url)) {
		this.$message.warning("导出地址不能为空！")
		return false;
	}

	this.$ajax.get(url, {
		params,
		responseType: 'blob'
	}).then(res => {
		if (!res) return;
		let filename = null;
		let blob = res.data;

		if (flag === 'zip') {
			filename = res.headers['content-disposition'] ? res.headers['content-disposition'].split(";")[1].split("filename=")[1] : name + '.zip';
		} else if (flag === 'qr') {
			filename = res.headers['content-disposition'] ? res.headers['content-disposition'].split(";")[1].split("filename=")[1] : name;
			filename = decodeURIComponent(filename);
		} else {
			filename = res.headers['content-disposition'] ? res.headers['content-disposition'].split(";")[1].split("filename=")[1] : name + '.xls';
		}

		if (typeof window.navigator.msSaveBlob !== 'undefined') {
			window.navigator.msSaveBlob(blob, filename);
		} else {
			var blobURL = window.URL.createObjectURL(blob);
			var tempLink = document.createElement('a');
			tempLink.style.display = 'none';
			tempLink.href = blobURL;
			tempLink.setAttribute('download', filename);

			if (typeof tempLink.download === 'undefined') {
				tempLink.setAttribute('target', '_blank');
			}

			document.body.appendChild(tempLink);
			tempLink.click();
			document.body.removeChild(tempLink);
			window.URL.revokeObjectURL(blobURL);
		}
	})
}

//表单验证不对滚回第一个报错位置
Vue.prototype.scrollToTop = function(className) {
	this.$nextTick(() => {
		let timer = null;
		let target = document.querySelector(className).offsetTop
		let lastPos = 0;

		function goMove() {
			let currentPosition = document.documentElement.scrollTop || document.body.scrollTop;
			currentPosition = parseInt(currentPosition)
			if (lastPos == currentPosition) { //页面高度不够长，未滑动到指定位置的时候，已经滑动到底部了
				window.scrollTo(0, target);
				clearInterval(timer);
				return;
			}
			lastPos = currentPosition;

			if (Math.abs(currentPosition - target) < 20) {
				window.scrollTo(0, target - 20);
				clearInterval(timer);
				return;
			}
			if (currentPosition - target > 20) {
				currentPosition -= 20;
				window.scrollTo(0, currentPosition);
			} else {
				currentPosition += 20;
				window.scrollTo(0, currentPosition);
			}
		}
		timer = setInterval(goMove, 10);

	})
};
/**
 * 检测当前当前用户登录的角色身份
 * @param  {...[type]} arg [角色身份id]
 * @return {[type]}        [description]
 */
Vue.prototype.roleBaseid = function(...arg) {
	let idList = arg
	let id = this.$store.getters.userInfo.check_rolebaseid
	return idList.includes(id) ? true : false
}